nginx 1.10.3 で、User-Agent をキーにしたアクセス制限の方法を解説します。
今回利用した環境の詳細は以下の通りです。
- Ubuntu 16.04.4
- nginx 1.10.3
User-Agent でアクセス制限を掛ける意図
User-Agent を利用してアクセス制限を掛ける場合は、大きく2パターンが存在します。
- 特定の User-Agent のみ許可する
- 特定の User-Agent を拒否する
前者はホワイトリスト方式で、特定アプリケーションのみ接続を許可したい場合に利用します。
スマートフォンアプリの API などで見かける方式です。
後者はブラックリスト方式で、攻撃アクセスや脆弱性スキャンなどをブロックする際に有効です。
今回は後者の「拒否パターン」を検証します。
User-Agent はいくらでも偽装が可能なため、本気で狙われた際には効果がありませんが、特定のスキャンツールを防ぐ観点では一定の効果が見込めます。
nginx で User-Agent によるアクセス制限を掛ける
今回は Mozilla/5.0 Jorgee
という User-Agent を拒否してみます。
この User-Agent は脆弱性スキャンツールなどで利用されています。
nginx の設定ファイルに以下の記述を追加します。
追記する先は、server
セクションの中であればどの設定ファイルでも構いません。
if ($http_user_agent = "Mozilla/5.0 Jorgee"){
return 403;
}
上記の例では 403
を返していますが、他のステータスコードも指定可能です。
比較演算子は以下の通りです。用途に応じて適切な比較演算子を利用しましょう。
=
: 完全一致で比較~
: 正規表現で比較~*
: 大文字/小文字を区別しない正規表現で比較
nginx のアクセス制限を確認する
まずは、nginx をリロードして設定を反映します。
OS によってコマンドが異なるため注意しましょう。
// Ubuntu や CentOS 7系の場合
$ sudo systemctl reload nginx
// CentOS 6系の場合
$ sudo service nginx reload
curl コマンドを使用してアクセスします。200
が返ってくれば問題なしです。
アクセス先の URL は環境に応じて修正してください。
$ curl -I http://<サーバー IP>/
HTTP/1.1 200 OK
次に、拒否設定した User-Agent を使ってアクセスしてみます。
403
はアクセス拒否を示しています。
$ curl -H "User-Agent: Mozilla/5.0 Jorgee" -I http://<サーバー IP>/
HTTP/1.1 403 Forbidden
User-Agent によってブロックされることを確認できました。
まとめ
nginx で、User-Agent によるアクセス制限の方法を紹介しました。
if 文ひとつで簡単に設定することができます。
拒否以外の使い方でも応用が可能です。
「スマートフォンの User-Agent はモバイル版にリダイレクト」といった処理も実現できます。
様々な条件でアクセスを制御できるため、ぜひご活用ください。
【関連記事】
⇒ Webサイトの不正アクセス防止
⇒ Apache, nginx, H2O の特徴を比較
⇒ nginx のインストール手順 (CentOS)
⇒ nginx に繋がらない場合の調査方法
⇒ nginx が起動しない場合の対処方法